Skip to content

释放指定图片内存1 - FreeImageData

函数简介

释放由插件独立堆分配的图像字节缓冲(delete[]),例如 BMP/PNG 文件字节流。
FreeImagePtr 职责不同:本接口释放的是 data 字节指针,不是 OLAImage 句柄。

接口名称

FreeImageData

DLL调用

int FreeImageData(long ola, long ptr);

参数说明

参数名类型说明
ola长整数型OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。
ptr长整数型独立分配的字节缓冲地址(见下方适用接口)。

适用 / 不适用

类别接口是否调用 FreeImageData
需要GetImageBmpDatadata必须
需要GetImagePngDatadata必须
需要GetScreenDataBmpdata必须
禁止GetImageDatadata禁止(内部视图,只 FreeImagePtr 句柄)
禁止LoadImage / GetScreenDataPtr 等返回的图像句柄禁止(应使用 FreeImagePtr)

示例

SDK 调用

cpp
#include "OLAPlugServer.h"

OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
        // 使用 bmpPtr / bmpSize ...
        ola.FreeImageData(bmpPtr);   // 释放 BMP 字节缓冲
    }
    ola.FreeImage(imgPtr);           // 另释放图像句柄(SDK 常用 FreeImage)
}
csharp
using OLAPlug;

var ola = new OLAPlugServer();
long imgPtr = ola.LoadImage(@"images\test.bmp");
if (imgPtr != 0)
{
    if (ola.GetImageBmpData(imgPtr, out long bmpPtr, out int bmpSize) == 1)
    {
        ola.FreeImageData(bmpPtr);
    }
    ola.FreeImage(imgPtr);
}
python
from OLAPlugServer import OLAPlugServer

ola = OLAPlugServer()
img_ptr = ola.LoadImage("images/test.bmp")
if img_ptr:
    ret, bmp_ptr, bmp_size = ola.GetImageBmpData(img_ptr)
    if ret == 1:
        ola.FreeImageData(bmp_ptr)
    ola.FreeImage(img_ptr)
java
import com.olaplug.OLAPlugServer;

OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
    var bmp = ola.GetImageBmpData(imgPtr);
    if (bmp != null && bmp.success) {
        ola.FreeImageData(bmp.data.data);
    }
    ola.FreeImagePtr(imgPtr);
}
go
import "github.com/ola/olaplug/olaplug"

ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.LoadImage("images/test.bmp")
if imgPtr != 0 {
    bmpPtr := 0; int bmpSize = 0
    if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
        ola.FreeImageData(bmpPtr)
    }
    ola.FreeImage(imgPtr)
}
rust
use olaplug::OLAPlugServer;

let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.load_image("images/test.bmp");
if imgPtr != 0 {
    let bmpPtr = 0; int bmpSize = 0;
    if (ola.get_image_bmp_data(imgPtr, &mut bmpPtr as *mut i32, &mut bmpSize as *mut i32) == 1) {
        ola.free_image_data(bmpPtr);
    }
    ola.free_image(imgPtr);
}
cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.LoadImage("images/test.bmp")
if(imgPtr) {
    var ret = ola.GetImageBmpData(imgPtr)
    ola.FreeImageData(ret.data)
    ola.FreeImage(imgPtr)
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.LoadImage("images/test.bmp")
If imgPtr <> 0 Then
    ret = ola.GetImageBmpData(imgPtr)
    ola.FreeImageData ret(0)
    ola.FreeImage(imgPtr)
End If
text
.局部变量 ola, OLAPlug
.局部变量 imgPtr, 长整数型
.局部变量 bmpPtr, 长整数型
.局部变量 bmpSize, 整数型

ola.创建 ()
imgPtr = ola.LoadImage (“images/test.bmp”)
.如果真 (imgPtr ≠ 0)
    .如果真 (ola.GetImageBmpData (imgPtr, bmpPtr, bmpSize) = 1)
        ola.FreeImageData (bmpPtr)
    .如果真结束
    ola.FreeImagePtr (imgPtr)
.如果真结束
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.LoadImage("images/test.bmp");
if(imgPtr){
    var ret, bmpPtr, bmpSize = ola.GetImageBmpData(imgPtr);
    if(ret == 1){
        ola.FreeImageData(bmpPtr);
    }
    ola.FreeImage(imgPtr);
}
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.LoadImage("images/test.bmp")
如果真 (imgPtr ≠ 0)
{
    长整数 bmpPtr = 0
    整数 bmpSize = 0, ret = 0
    ret = ola.GetImageBmpData(imgPtr, bmpPtr, bmpSize)
    如果真 (ret = 1)
    {
        ola.FreeImageData(bmpPtr)
    }
    ola.FreeImagePtr(imgPtr)
}
cpp
#include "OLAPlugServer.h"

OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
    long bmpPtr = 0; int bmpSize = 0;
    if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
        ola.FreeImageData(bmpPtr);
    }
    ola.FreeImage(imgPtr);
}

原生 DLL 调用

cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = LoadImage(instance, "images/test.bmp");
long bmpPtr = 0; int bmpSize = 0;
if (GetImageBmpData(instance, imgPtr, &bmpPtr, &bmpSize) == 1) {
    FreeImageData(instance, bmpPtr);
}
FreeImagePtr(instance, imgPtr);
csharp
GetImageBmpData(instance, imgPtr, out long bmpPtr, out int bmpSize);
FreeImageData(instance, bmpPtr);
FreeImagePtr(instance, imgPtr);
python
data = c_int64(0); size = c_int(0)
ola.GetImageBmpData(instance, img_ptr, byref(data), byref(size))
ola.FreeImageData(instance, data)
ola.FreeImagePtr(instance, img_ptr)

返回值

返回值说明
1成功。
0失败。

注意事项

结论GetImageDatadata 不要 用本接口释放;FreeImagePtr 也不会 自动释放本接口负责的 BMP/PNG 缓冲。二者职责分离,勿混用。完整对照见 图像处理模块总览

字节流 / 句柄所有权对照

接口对象是什么如何释放
GetImageData句柄内部的 BGRA 像素视图(与 OLAImage 同生命周期)只调 FreeImagePtr(imgPtr)禁止 FreeImageData(data)
GetImageBmpData新分配的完整 BMP 文件字节必须 FreeImageData(data),句柄另调 FreeImagePtr
GetImagePngData新分配的完整 PNG 文件字节必须 FreeImageData(data),句柄另调 FreeImagePtr
FreeImagePtr释放 OLAImage 图像句柄释放上述 BMP/PNG 的 data
FreeImageData(本接口)释放独立堆分配的字节缓冲释放图像句柄
项目说明
与 FreeImagePtr 关系互不替代、互不自动调用。导出 BMP/PNG 后通常两者都要调:先 FreeImageData(data),再 FreeImagePtr(imgPtr)
勿对 GetImageData 使用GetImageDatadata 属于句柄内部像素,对其 FreeImageData 会导致崩溃或堆损坏。
勿对句柄使用图像句柄只能 FreeImagePtr / SDK FreeImage
重复释放同一 data 不要重复 FreeImageData